home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / sbin / syslogd-listfiles < prev    next >
Text File  |  2008-08-29  |  4KB  |  147 lines

  1. #! /usr/bin/perl
  2.  
  3. # Copyright (c) 1998,9,2001,3 by Martin Schulze <joey@infodrom.org>
  4.  
  5. # This program is free software; you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation; either version 2 of the License, or
  8. # (at your option) any later version.
  9. # This program is distributed in the hope that it will be useful,
  10. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. # GNU General Public License for more details.
  13. # You should have received a copy of the GNU General Public License
  14. # along with this program; if not, write to the Free Software
  15. # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
  16.  
  17. $conf = "/etc/syslog.conf";
  18. $opt_daily = 1;
  19. $opt_all = 0;
  20. $opt_auth = 0;
  21. $opt_ign_size = 0;
  22. $opt_news = 0;
  23. $opt_skip = '';
  24. $opt_large = 1024*1024;
  25.  
  26. sub usage
  27. {
  28.     print STDERR
  29. "
  30. Debian GNU/Linux syslogd-listfiles.  Copyright (c) 1997,2001
  31. Martin Schulze.  This is free software; see the GNU General Public Licence
  32. version 2 or later for copying conditions.  There is NO warranty.
  33.  
  34. Usage: syslogd-listfiles <options>
  35. Options: -f file    specifies another syslog.conf file
  36.          -a | --all    list all files (including news)
  37.          --auth        list all files containing auth.<some prio>
  38.      --ignore-size  don't rotate files which got too large
  39.          --large nnn    define what is large in bytes (default: 1MB)
  40.          --news        include news logfiles, too
  41.          -w | --weekly    use weekly pattern instead of daily
  42.          -s pattern    skip files matching pattern
  43. ";
  44. }
  45.  
  46. # Test if the file was already rotated within the last n hours
  47. # with n=5
  48. #
  49. sub rotated
  50. {
  51.     my $file = shift;
  52.     my $nfile;
  53.     my $delta = 5 * 60 * 60;
  54.     my $now = time();
  55.     
  56.     # /var/log/file -> /var/log/file.0
  57.     $nfile = $file . ".0";
  58.     if (-r $nfile) {
  59.     if (($now - (stat $nfile)[9]) > $delta) {
  60.         return 0;
  61.     } else {
  62.         return 1;
  63.     }
  64.     }
  65.  
  66.     # /var/log/file -> /var/log/OLD/file.0
  67.     $nfile =~ s,(.*)/([^/]+),$1/OLD/$2,;
  68.     if (-r $nfile) {
  69.     if (($now - (stat $nfile)[9]) > $delta) {
  70.         return 0;
  71.     } else {
  72.         return 1;
  73.     }
  74.     }
  75.  
  76.     return 0;
  77. }
  78.  
  79. while (@ARGV) {
  80.     $_=shift(@ARGV);
  81.     if (m/^-f$/) {
  82.     $conf = shift(@ARGV);
  83.     } elsif (m/^-s$/) {
  84.     $opt_skip = shift(@ARGV);
  85.     } elsif (m/^--large$/) {
  86.     $opt_large = shift(@ARGV);
  87.     } elsif (m/^(--weekly|-w)$/) {
  88.     $opt_daily = 0;
  89.     } elsif (m/^(-a|--all)$/) {
  90.     $opt_all = 1;
  91.     } elsif (m/^--auth$/) {
  92.     $opt_auth = 1;
  93.     } elsif (m/^--ignore-size/) {
  94.     $opt_ign_size = 1;
  95.     } elsif (m/^--news$/) {
  96.     $opt_news = 1;
  97.     } else {
  98.     &usage();exit (0);
  99.     }
  100. }
  101.  
  102. open (C, $conf) || die "Can't open $conf, $!";
  103. while (<C>) {
  104.     next if (/^(\#|$)/);
  105.     chomp;
  106.  
  107.     s/\s*(\S.*)$/$1/ if ($line);
  108.  
  109.     $line .= $_;
  110.     chop ($line) if (/\\$/);
  111.     if (!/\\$/) {
  112.     $line =~ s/\s+/\t/;
  113.     $line =~ s/\t-/\t/;
  114.     push (@lines, $line) if ($line =~ /\t\/(?!dev\/)/);
  115.     $line = "";
  116.     }
  117. }
  118. close (C);
  119.  
  120. foreach $line (@lines) {
  121.     ($pat,$file) = split (/\t/,$line);
  122.  
  123.     # These files are handled by news.daily from INN, so we ignore them
  124.     next if (!$opt_news && ($pat =~ /news\.(\*|crit|err|info|notice)/));
  125.  
  126.     if ($opt_all) {
  127.     $output{$file} = 1;
  128.     } elsif ($opt_auth) {
  129.     $output{$file} = 1 if ($pat =~ /auth[^\.]*\.(?!none).*/);
  130.     } else {
  131.     $everything = ($pat =~ /\*\.\*/);
  132.     $output{$file} = 1 if (($everything && $opt_daily)
  133.                    || (!$everything && !$opt_daily && !rotated ($file))
  134.                    || (!$opt_ign_size && ((stat $file)[7] >= $opt_large) && $opt_daily)
  135.                    );
  136.     }
  137. }
  138.  
  139. foreach $file (keys (%output)) {
  140.     $skip = $file;
  141.     if (!length($opt_skip) ||  $skip !~ /$opt_skip/) {
  142.     printf "%s\n", $file;
  143.     }
  144. }
  145.